package com.ht.api.service;

import javax.sql.DataSource;

import com.ht.api.db.Db;
import com.ht.api.db.DbConfig;
import com.ht.api.db.Entity;
import com.ht.api.db.task.HtTaskExecutor;
import com.ht.api.db.task.Plan;
import com.ht.api.db.task.TaskHandler;
import com.ht.api.db.task.TaskInfo;
import com.ht.api.task.KfSessionOverTask;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 客服会话相关service
 * @author asq
 * @createTime 2025年4月9日 21:01:44
 */
@Slf4j
public class KfService {
    /** 客服会话过期任务 */
    private static TaskHandler sessionTask = new KfSessionOverTask();

	/**
	 * 监控客服会话过期的定时任务
	 * @param ds
	 * @param kfSession
	 */
	public static void monitorSessionTask(DataSource ds, Entity kfSession) {
		if (kfSession != null) {
			// 执行计划为：24小时后执行1次
			int startTime = (int) (System.currentTimeMillis() / 1000) + 60 * 60 * 24;
			Plan plan = Plan.create().at(startTime);
			
			// 根据是否有taskId判断是新启动任务还是修改执行计划
			String sessionId = kfSession.getMainId();
			long tenantId = DbConfig.getTenantId(ds);
			Long taskId = kfSession.getLong("task_id");
			if (taskId == null) {
				taskId = createMonitorTask(tenantId, sessionId, plan);
				log.info("监控客服会话过期，启动定时任务，taskId:{}", taskId);
			} else {
				TaskInfo taskInfo = HtTaskExecutor.changePlan(taskId, plan);
				if (taskInfo == null) {
					taskId = createMonitorTask(tenantId, sessionId, plan);
				}
			}
			
			// 将taskId写入客服会话表
			Entity kfSessionUpdate = Entity.create("kf_session");
			kfSessionUpdate.setMainId(sessionId);
			kfSessionUpdate.set("task_id", taskId);
			Db.insert(ds, kfSessionUpdate);
		}
	}

	/**
	 * 创建一个客服会话过期任务
	 * @param tenantId 数据源
	 * @param sessionId 客服会话main_id
	 * @param plan 执行计划
	 * @return
	 */
	private static Long createMonitorTask(long tenantId, String sessionId, Plan plan) {
		JSONObject taskParam = JSONUtil.createObj();
		taskParam.set("kfSessionId", sessionId);
		taskParam.set("tenant_id", tenantId);
		return HtTaskExecutor.submitTask(taskParam, sessionTask, plan);
	}
}
